<?php

namespace app\index\controller;

use think\Request;
use lib\builtin\auth\Auth as AuthManager;
use app\common\model\User;
use app\common\services\Password as PasswordService;
use app\index\BaseController;

class Users extends BaseController
{
    // 普通用户默认权限，配合/config/auth.php食用
    const DEFAULT_AUTH = 1;

    /**
     * 获取所有用户或者按条件筛选用户
     *
     * @return \think\Response
     * @args username+ 用户名
     * @args realname+ 真实姓名
     * @args role+ 权限角色(编号)
     * @args is_superadmin+ 是否是超级管理员
     * @args is_active+ 是否可用
     * @args page? 页码
     */
    public function queryUsers(Request $requst)
    {
        $query = new User();
        if ($requst->has('username')) {
            $query = $query->where('username', 'like', '%' . $requst->username . '%');
        }
        if ($requst->has('realname')) {
            $query = $query->where('realname', 'like', '%' . $requst->realname . '%');
        }
        if ($requst->has('role')) {
            $query = $query->where('role', $requst->role);
        }
        if ($requst->has('is_superadmin')) {
            $is_superadmin = boolval($requst->is_superadmin) ? 1 : 0;
            $query = $query->where('is_superadmin', $is_superadmin);
        }
        if ($requst->has('is_active')) {
            $is_active = boolval($requst->is_active) ? 1 : 0;
            $query = $query->where('is_active', $is_active);
        }

        $users = $query->paginate(15);
        return json($users);
    }

    /**
     * 获取指定用户
     *
     * @param  int  $id
     * @return \think\Response
     * @args id 用户ID
     */
    public function getUser($id)
    {
        $user = User::where('id', $id)->find();
        return json($user);
    }

    /**
     * 创建用户
     *
     * @return \think\Response
     * @args username 用户名
     * @args realname 真实姓名
     * @args password+ 加密后的密码
     * @args enkey+ 加密后的key
     * @args iv+ 随机向量
     * @args role+ 权限角色(编号)，默认普通权限
     * @args is_active+ 是否可用，默认可用
     */
    public function createUser()
    {
        $username = input('username');
        $realname = input('realname');
        $password = input('password');
        $enkey = input('enkey');
        $iv = input('iv');
        $role = input('role', 1);
        $is_active = input('is_active', true);

        // 使用默认私钥解密密码
        $password = PasswordService::decrypetPassword($enkey, $iv, $password);

        // 检查用户是否存在
        if (User::where('username', $username)->find()) {
            error('用户已经存在');
        }

        // 创建用户
        $user = new User([
            'username' => $username,
            // 'password' => $password, 密码需要经过hash
            'realname' => $realname,
            'role' => $role,
            'is_superadmin' => false, // 禁止从Web界面创建超级管理员
            'is_active' => $is_active,
        ]);
        $user->setPassword($password);
        $user->save();

        // 返回响应
        return json([
            'message' => '用户创建成功'
        ]);
    }

    /**
     * 修改用户密码
     *
     * @param  int  $id
     * @return \think\Response
     * @args id 用户ID
     * @args password+ 加密后的密码
     * @args enkey+ 加密后的key
     * @args iv+ 随机向量
     */
    public function changeUserPassword($id)
    {
        $password = input('password');
        $enkey = input('enkey');
        $iv = input('iv');

        // 使用默认私钥解密密码
        $password = PasswordService::decrypetPassword($enkey, $iv, $password);

        // 检查用户是否存在
        /** @var User $user */
        $user = User::where('id', $id)->find();
        if (!$user) {
            error('用户不存在');
        }

        // 修改密码
        $user->setPassword($password);
        $user->save();

        // 返回响应
        return json([
            'message' => '密码修改成功'
        ]);
    }

    /**
     * 修改用户信息
     *
     * @param  int  $id
     * @return \think\Response
     * @args id 用户ID
     * @args username+ 用户名
     * @args realname+ 真实姓名
     * @args role+ 权限角色(编号)，默认普通权限
     * @args is_active+ 是否可用，默认可用
     */
    public function editUser(Request $requst, $id)
    {
        // 检查用户是否存在
        /** @var User $user */
        $user = User::where('id', $id)->find();
        if (!$user) {
            error('用户不存在');
        }

        // 接受输入并修改信息
        $argList = [
            'username',
            'realname',
            'role',
            'is_active',
        ];
        foreach ($argList as $argName) {
            if ($requst->has($argName)) {
                $user->{$argName} = $requst->{$argName};
            }
        }

        // 保存生效
        $user->save();

        // 返回响应
        return json([
            'message' => '用户信息修改成功'
        ]);
    }

    /**
     * 删除指定用户
     *
     * @param  int  $id
     * @return \think\Response
     * @args id 用户ID
     */
    public function removeUser($id)
    {
        // 检查用户是否存在
        /** @var User $user */
        $user = User::where('id', $id)->find();
        if (!$user) {
            error('用户不存在');
        }

        // 删除
        $user->removeAvatarIfExist();
        $user->delete();

        // 返回响应
        return json([
            'message' => '删除成功'
        ]);
    }

    /**
     * 获取所有权限
     *
     * @return \think\Response
     */
    public function getAllPermissions(AuthManager $auth)
    {
        return json($auth->getAllPermissions());
    }

    /**
     * 获取所有角色
     *
     * @return \think\Response
     */
    public function getAllRoles(AuthManager $auth)
    {
        return json($auth->getAllRoles());
    }
}
